var OneThink=function(obj_p)
{
    this.表现进化力=obj_p.表现进化力;
    this.本能进化力=obj_p.本能进化力;//相对稳定
    this.探索=obj_p.探索;
    this.认同=obj_p.认同;
    this.对比=obj_p.对比;
    this.pos=obj_p.pos;//xz表示平面社交网络，y表示社交地位
    this.inner=obj_p.inner;//加和为进化力
    this.outer=obj_p.outer;//考虑周围环境进行分配，还是初始与inner相同？
    this.radius=obj_p.radius;
    this.view=obj_p.view;
    this.sensitivity=obj_p.sensitivity;
    this.antieducation=obj_p.antieducation;
    this.id=obj_p.id;

    this.doing="standing";//正在做的事
    this.wanting="waiting";//想要做的事
    this.being="free";//正在遭受
    //this.obj_skills={};//技能列表?
    this.countfans=0;
    this.countfoods=0;
    this.countlovers=0;
    this.lastcountfans=0;
    this.lastcountfoods=0;
    this.lastcountlovers=0;
}
//在计算每个单位的当前影响范围前，先清空旧的影响范围《-影响范围变化率如果很低则这个计算会比较冗余
OneThink.clearAllInfluence=function(arr_part){
    arr_part.forEach((arr,i)=>{
        arr.forEach((obj_part,j)=>{
            obj_part.arr_influence=[];
        })
    })
}
OneThink.oneMakeInfluence=function(unit,arr_part,partSize){
    //if(!unit.influence)
    {unit.influence=unit.表现进化力*unit.pos.y;}//暂时使用这个算法,这样默认单位都是100
    unit.step_influence=Math.ceil(unit.influence/partSize+1);
    //对于自己所不在的地块注入影响力
    var arr_part_found=OneThink.getArrPartbyStep(arr_part[unit.partx][unit.partz],unit.step_influence);
    arr_part_found.forEach((obj)=>{
        for(var xz in obj)
        {
            var obj_part=obj[xz];
            obj_part.arr_influence.push(unit);
        }
    })
}
//参数：单位对象、其他所有单位对象、地块索引表
OneThink.think=function(unit,obj_units,arr_part){
    var obj_part=arr_part[unit.partx][unit.partz];
    //遍历所有和自己处于同一地块的单位，以及虽处于其他地块但影响到这一地块的单位
    var arr_neighbor=obj_part.arr_unit;
    var max_score=0;
    var max_one=null;
    unit.obj_evaluate={};
    arr_neighbor.forEach((neighbor,i)=>{
        if(neighbor.id!=unit.id)
        {
            var dis=vxz.distance(unit.pos,neighbor.pos);
            if(dis<unit.view)
            {
                var score=OneThink.evaluate(unit,neighbor)//最后得出的将是一个明确的唯一向量，认为只有最强烈的吸引决定人的选择
                unit.obj_evaluate[neighbor.id]=score;//使用这个结构意味着，不能直接发送对象！！！！？？
                if(score>max_score)
                {
                    max_score=score;
                    max_one=neighbor;//最瞩目的对象，这样计算则好感度必然是正的。
                }
                if(score>unit.sensitivity)//向对方表达善意
                {
                    neighbor.countfans++;
                }
            }

        }
    })
    var arr_star=obj_part.arr_influence;
    arr_star.forEach((neighbor,i)=>{
        if(neighbor.id!=unit.id)
        {
            var dis=vxz.distance(unit.pos,neighbor.pos);
            if(dis<unit.view)
            {
                var score=OneThink.evaluate(unit,neighbor)//最后得出的将是一个明确的唯一向量，认为只有最强烈的吸引决定人的选择
                unit.obj_evaluate[neighbor.id]=score;//使用这个结构意味着，不能直接发送对象！！！！？？
                if(score>max_score)
                {
                    max_score=score;
                    max_one=neighbor;//最瞩目的对象，这样计算则好感度必然是正的。
                }
                if(score>unit.sensitivity)//向对方表达善意
                {
                    neighbor.countfans++;
                }
            }

        }
    })
    //根据所有分数的结果设定移动目标
    if(max_one&&max_score>unit.antieducation)//有瞩目目标，且瞩目目标得分超过antieducation
    {//直接移动到目标位置，当视野移动到地块中时，前端触发一次物理检测(y越高则质量越大，在圆柱底部建立同样高度的圆球仿真器，圆球半径比圆柱略小一点)
        // 解决重叠问题，物理检测后的位置调整结果反写回think线程？确定物理运动完成后再回写Think
        //不应反写，只把物理去重叠当作前台的一次性可选项，只用来辅助显示
        unit.wanting="stayCloseto";
        unit.max_one=max_one;
        var dis=vxz.distance(unit.pos,max_one.pos);//单位距离瞩目者之间的距离
        var dis2=unit.radius+max_one.radius;//单位距离瞩目者的半径和
        if(dis>(dis2*2))
        {//移动到瞩目者身边一定距离
            unit.moveto=vxz.add(unit.pos,vxz.times(vxz.normal(vxz.substract(unit.pos,max_one.pos)),dis-(dis2*2)))
        }
        else
        {
            unit.moveto=null;
        }
    }
    else
    {
        unit.max_one=null;
    }
}
OneThink.evaluate=function(one,another)//计算one对another的好感度
{
    var score=0;//不喜欢也不讨厌
    for(var key in one.inner)
    {

        if(another.outer[key]>one.sensitivity)//如果another表现出的某一种特质被one察觉到
        {
            //如果将sensitivity作为中间值，value-sensitivity作为 one支持这一种可辩论正义的程度，
            //one越认识到自己支持这一观念，并且认识到他人越支持这一观念，则在这一观念上的分越高
            //反之如果one的支持在sensitivity以下，则可以理解为反对，也就是负分
            var num=(another.outer[key]-one.sensitivity)*(one.inner[key]-one.sensitivity);
            score+=num;
        }
    }
    //如果another的影响力低于one，则one会注意到这一点
    if(another.influence<one.influence)
    {
        one.countfoods++
    }
    return score;
}

OneThink.do=function(one)
{
    if(one.max_one)
    {
        one.max_one.countlovers++;//比称赞更强烈//对瞩目者和好人都表达善意，但主动靠近瞩目者
        //或许可以假设瞩目者很聪明，能够知道是什么特质吸引了对方，并有目的的强化其outer
        // ，但max_one的inner可能并不与one的outer相符
        //所以只假设max_one在感受到自己的吸引后，再次强化自己的特长
        if(one.moveto)
        {
            one.pos=one.moveto;
            one.moveto=null;

        }
    }

}
OneThink.reflect=function(one)
{
    one.pos.y=1+one.countlovers/2;//单位的威望
    var 认同get=one.countfans;//在认同方面的收获，要与在认同上的欲望预期比较
    var 对比get=one.countfoods;
    if(认同get==0)
    {
        one.认同=0;
        one.表现进化力=one.探索+对比get;
        one.对比=one.本能进化力-one.探索;
    }
    else if(one.max_one)
    {
        one.表现进化力=one.本能进化力;
        one.对比=0;
        one.认同=one.本能进化力-one.探索;
    }
    else
    {//惯性的保持“对比”与“认同”的比例，进化力也保持稳定《-在createRandomThem时建立差异
        //one.对比=对比get;
        //one.认同=one.本能进化力-one.探索-one.对比
    }
    //接下来根据表现进化力和本能进化力分配正义元素《-可能由外界影响其分配比例
    if(one.max_one)
    {//one与max_one都喜欢的被强化，相反的one向max_one靠近
        var another=one.max_one;
        for(var key in one.inner)
        {
            var num_temp=(another.outer[key]-one.sensitivity)*(one.inner[key]-one.sensitivity)
            if(num_temp>0)
            {
                one.inner[key]=(another.outer[key]+one.inner[key])/2;
                one.outer[key]=one.inner[key];
            }
            else
            {
                one.inner[key]=(one.sensitivity+another.outer[key])/2;//立即扭转到偶像一边
                one.outer[key]=one.inner[key];
            }
        }
    }
    else {
        var influence=one.表现进化力*one.pos.y;
        if(influence>one.influence)
        {//单位受到激励，表现得更加认可自己当前认可的
            for(var key in one.outer)
            {
                if(one.outer[key]>one.sensitivity)
                {//加强能够认识到的自己的优点<-加强多少？
                    one.outer[key]=one.outer[key]*influence/one.influence;
                }
            }

        }
        //one.influence=influence;
    }
    one.lastcountfans=one.countfans;
    one.lastcountfoods=one.countfoods;
    one.lastcountlovers=one.countlovers;
    one.countfans=0;
    one.countfoods=0;
    one.countlovers=0;

    OneThink.prorate(one.表现进化力,one.outer);
    OneThink.prorate(one.本能进化力,one.inner);
    //如果探索不变，则会有一部分转移到“对比”，对比分为两种一是有实际对象的对比，这会反应为可见的进化力，
    //另一种是只有one自己知道的虚幻对比，消耗了进化力但不可见
    //另外，在欲望满足后会扩大，其扩大速度可以认为与抗教化能力成反比

    //这个纯粹进行意见交换的投票式讨论场景中“探索”不变（没有生产环节），所有人认为自己在参加实验，具有保底的探索激励度
    //进化力表示单位的活跃程度，在顺境和逆境中都可能会增高或降低，
    //比如一个科学家发挥出极大的进化力进行研究工作，其原因既可能是为了探索未知、也可能是为了道德目标、也可能是为了超过他人
    //所以进化力可以表现为这三种欲望的叠加，问题在于在90的欲望下做出了90的努力，但得到的未必是90的结果
    // ，这会反馈改变三种欲望的比例，进而改变进化力的值。进化力来自于智力进化本能，是很难压缩的，但可被转化
    //在这欲望具体的表达过程中又因人的性格不同，将进化力分配给不同的正义元素
    //one.
}
//评估能够观察到的单位，靠近感兴趣的目标，
//根据感兴趣的目标修改自己的内在型与表现型，强化能够吸引他人的表现型
//进化力发挥程度与社交地位决定影响范围
//根据状态的不同，决定三种内在力量的变化

//寻找地块应该是直接遍历空间内的所有地块索引，还是根据规则从起点地块一圈一圈查找？
//这取决于一个线程能够负担多少单位的计算，假设一个地块平均保有100个单位，估计一个线程最多负责计算10000个单位，也就是最多可能有100个地块，10*10排列，最大步数不超过20
//根据步数寻找单位一定范围内的地块
OneThink.getArrPartbyStep=function(obj_part,step_influence)
{
    var arr_part_found=[];
    //var depth=0;
    for(var i=0;i<step_influence;i++)
    {
        arr_part_found.push({});
    }
    OneThink.getArrPartbyStep2(obj_part,step_influence,'o',0,arr_part_found);

    return arr_part_found;
}
OneThink.arr_direction=[0,1,2,3]//[东南北西]这样相反的方向相加结果都是3！//["west","north","east","south"];//{"west":0,"north":1,"east":2,"south":3,"o":999}//
OneThink.getArrPartbyStep2=function(obj_part,step_influence,from,depth,arr_part_found)
{
    if(depth<step_influence)
    {
        // var index_from=arr_direction[from];
        // for(var to in arr_direction)
        // {
        //     if(to!=from)
        //     {
        //         if(obj_part[to])
        //         {
        //             arr_part_found[depth].push(obj_part[to]);
        //             var int_temp=Math.abs(index_from-arr_direction[to]);
        //             if(int_temp==2&&int_temp>900)
        //             {
        //                 depth+=2
        //             }
        //         }
        //     }
        // }
        OneThink.arr_direction.forEach((to,index)=>{
            if((to+from)!=3||from=="o")//比如从左向右进入下一个地块，则下一个地块不应重复检测自身的西方，而从起点出发时要检测所有方向
            {
                var obj_part2=obj_part[to];
                if(obj_part2)
                {
                    if(!arr_part_found[depth][obj_part2.partx+"_"+obj_part2.partz])//每个地块只添加一次
                    {
                        arr_part_found[depth][obj_part2.partx+"_"+obj_part2.partz]=(obj_part2);
                        //depth+=1;
                        OneThink.getArrPartbyStep2(obj_part2,step_influence,to,depth+1,arr_part_found);
                    }

                }
            }
        })


    }

}
//按一定比例分配进化力
OneThink.prorate=function(sum,obj_ratio)
{
    var sum_temp=0;
    for(var key in obj_ratio)
    {
        sum_temp+=obj_ratio[key];
    }
    var rate=sum/sum_temp;
    for(var key in obj_ratio)
    {
        obj_ratio[key]=obj_ratio[key]*rate;
    }
}
